/* 
 * File:   main.cpp
 * Author: huzeyfe
 *
 * Created on 8. Dezember 2011, 07:11
 */

#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <stdlib.h>
#include <unistd.h>
#include "TaskConv.h"
#include "TaskLog.h"
#include "TaskStat.h"
#include "TaskReport.h"
#include "SharedMemory.h"

using namespace std;

/*
 * 
 */
int main() {

   pid_t convPid, logPid, statPid, reportPid;

    TaskConv conv;
    TaskLog log;
    TaskStat stat;
    TaskReport report;
    SharedMemory mess(10);
    SharedMemory statistik(10);
    int tmp [sizeof(mess)];
    int fd_cs[2];
    int fd_cl[2];
    int fd_sr[2];

    pipe(fd_cs);
    pipe(fd_cl);
    pipe(fd_sr);

    printf("Elternprozess: Die PID lautet %d\n", getpid());

    convPid = fork();

    if(convPid == -1) {
        perror("fork convPid");
        return(1);
    } else if(convPid == 0) {
       // close(fd_cl[0]);
        printf("Prozess Conv: Die PID lautet: %d\n", getpid());
        printf("Prozess Conv: Die PID des Elternprozess lautet %d\n", getppid());

        while(1) {
            // HIER KOMMT UNSERE METHODE FÜR CONVERTER REIN, WELCHE ZUFALLSZAHLEN GENERIERT
            //pipe(fd[1], )
           int zahl = conv.random();
           mess.enter(zahl);
           // write(fd_cl[1], tmp, 11);
        }
    }
    else if(convPid > 0)
    {

            logPid = fork();

            if(logPid == -1) {
                perror("fork logPid");
                return(1);
            } else if(logPid == 0) {
                //close(fd_cl[1]);
                printf("Prozess Log: Die PID lautet: %d\n", getpid());
                printf("Prozess Log: Die PID des Elternprozess lautet %d\n", getppid());

                while(1) {
                    mess.leave();
                // HIER KOMMT UNSERE METHODE FÜR LOG REIN, WELCHE ZUFALLSZAHLEN LIEST UND AUF DIE PLATTE SPEICHERT
                   // read(fd_cl[0], tmp, 11);
                }
           } else if(logPid > 0)
           {

            statPid = fork();

            if(statPid == -1) {
                perror("fork statPid");
                return(1);
            } else if(statPid == 0) {
                printf("Prozess Stat: Die PID lautet: %d\n", getpid());
                printf("Prozess Stat: Die PID des Elternprozess lautet %d\n", getppid());

                while(1) {
                // HIER KOMMT UNSERE METHODE FÜR STAT REIN, WELCHE ZUFALLSZAHLEN VOM SPEICHERBEREICH MESS LIEST UND SCHREIBT STATISTISCHE DATEN IN DEN SPEICHERBEREICH STATISTIK
                    printf("Michael!\n");
                }
            } else if(statPid > 0)
            {
                
                reportPid = fork();

                if(reportPid == -1) {
                    perror("fork reportPid");
                    return(1);
                } else if(reportPid == 0) {
                    printf("Prozess Report: Die PID lautet: %d\n", getpid());
                    printf("Prozess Report: Die PID des Elternprozess lautet %d\n", getppid());

                    while(1) {
                        printf("Signalhandler!\n");
                        // HIER KOMMT UNSERE METHODE FÜR REPORT REIN, WELCHE ZUFALLSZAHLEN VOM SPEICHERBEREICH STATISTIK LIEST UND GIBT DIESE AUS
                    }
                }
            }
        }
    }
    return 0;
}

